--settings of prog
dofile("include/splashLib.lua")

--variables--
gray = Color.new(180, 180, 180);
white = Color.new(255, 255, 255)
red = Color.new(255,0,0)
black = Color.new(0,0,0)
darkgray = Color.new(100, 100, 100, 128)

ifont = IntraFont.load("font.pgf", 0);
ifont:setStyle(1.0, white, darkgray, IntraFont.ALIGN_CENTER);

splash1 = Image.load("IMAGES/Splash1.png")
splash2 = Image.load("IMAGES/Splash2.png")
splash3 = Image.load("IMAGES/Splash3.png")

pause = Image.load("IMAGES/pause.png")
cochonfix = Image.load("IMAGES/Players/cochon.png")
image = Image.load("IMAGES/Levels/red_small.png")
cochonleft = Image.load("IMAGES/Players/cochonleft.png")
cochonright = Image.load("IMAGES/Players/cochonright.png")
cochon = {}
cochon.x = 240
cochon.y = 187
cochon.img = nil
move_left = true
move_right = true
move_fix = true

levels = 1
ifBallExist = false
load = false
--fond = Image.load("IMAGES/Levels/" .. levels .. ".png")
patron = Image.load("IMAGES/Levels/Patron.png")
statut = nil 
---------------------------------------------------------------------

---all functions---
function Firmware()

file = io.open("flash0:/vsh/etc/version.txt","r")
firmware = file:read()
file:close()
 
display = string.sub(firmware,9,12)

end

function DisplayUsername()

pseudo = io.open("flash1:/registry/system.dreg", "r")
pseudo:seek("set", 0x3580)
reead = pseudo:read(27)
pseudo:close()

end

function ClearRam(garbage_limit)

  if statut == "SplashScreen" then
    Image.free(splash1)    --|
    Image.free(splash2)    --|--> nil
    Image.free(splash3)    --| 
  end  
  
  if statut == "MainMenu" then
    ifont:unload()
    Image.free(fond)
    selecteur = nil
  end  
    
  if statut == "Setup" or statut == "Help" or statut == "End" then
    Image.free(fond)
    selecteur = nil
  end
  
  
local i=0
repeat
i=i+1
collectgarbage()
until i==math.ceil(math.abs(tonumber(garbage_limit)))+1+1
end

function SplashScreen()

LastTime = 21000
counter = Timer.new(0)
  while true do
   currentTime = counter:time()
   
    if currentTime >= 1 then
      System.splashScreen(splash1, splash2, splash3, .75)
      screen:flip()
    end

    if currentTime >= 21000 then
      statut = "SplashScreen"
      ClearRam(100)
      return false
    end  
  end
screen:clear()
end

function Help()
local fond = Image.load("IMAGES/Help.png") -- load the image help
selecteur = 1

  while true do

   System.draw()
    screen:clear() --refresh the screen
    screen:blit(0,0,fond) --print the Help fond
   System.endDraw()
   
    if selecteur > 1 then
      selecteur = 1
    end -- if it's higher than 1

    if selecteur < 1 then
      selecteur = 1
    end -- ""  ""  ""  ""  ""  ""  ""  ""  "" ""

    if selecteur == 1 then
      System.draw()
      screen:print(331,251,"->",red)
      screen.waitVblankStart()
      System.endDraw()
    end -- we print the cursor

    if Controls.readPeek():cross() then
      if selecteur == 1 then
        statut = "Help"
        MainMenu()
        return false
      end
    end
  
   screen.flip() -- refresh the screen
   screen.waitVblankStart()
  end
ClearRam(100)  
end

function Setup()
local fond = Image.load("IMAGES/Setup.png") -- load the image Setup.png
selecteur = 1 -- we give it 1 as the first choice

  while true do

   System.draw()
    screen:clear() --clear the screen
    screen:blit(0,0,fond)
   System.endDraw()
  
    if selecteur > 1 then
      selecteur = 1
    end -- if it's higher than 1

    if selecteur < 1 then
      selecteur = 1
    end -- ""  ""  ""  ""  ""  ""  ""  ""  "" ""

    if selecteur == 1 then
      System.draw()
      screen:print(343,248,"->",red)
      screen.waitVblankStart()
      System.endDraw()
    end -- we print the cursor

    if Controls.readPeek():cross() then
      if selecteur == 1 then
        statut = "Setup"
        MainMenu()
        return false
      end
    end

    if Controls.readPeek():cross() then -- si la touche X et pressee
      MainMenu()
    end

   screen.flip() -- refresh screen
   screen.waitVblankStart()
  end
ClearRam(100)
end

function Pause()

  while true do
  
   System.draw()
    --screen:blit(80,40, pause)
    screen:print(150,134,"pause",white)
   System.endDraw()
   
    if Controls.readPeek():circle() then
      System.draw()
      --pause:clear()
      System.endDraw()
      return false
    end
    
    if Controls.readPeek():cross() then
      statut = "End"
      MainMenu()    
      return false
    end
    
   screen.waitVblankStart()
   --System.showFPS()
   screen:flip()
  end
ClearRam(100)
end

function SinglePlayer()
Level()
end


function StayingAlive()
  
  --Flip buffers
  screen.flip()
  
  while true do
  
  result = System.msgDialog("Cette partie n'est pas encore creee veuillez patienter ^^", false)
  
  if (result == System.MSGDIALOG_RESULT_YES or result == System.MSGDIALOG_RESULT_NO or result == System.MSGDIALOG_RESULT_BACK or result == System.MSGDIALOG_RESULT_UNKNOWN1) then
    break;
  end

  end
MainMenu()
end

function TwoPlayers()
  --Flip buffers
  screen.flip()
  
  while true do
  
  result = System.msgDialog("Cette partie n'est pas encore creee veuillez patienter ^^", false)
  
  if (result == System.MSGDIALOG_RESULT_YES or result == System.MSGDIALOG_RESULT_NO or result == System.MSGDIALOG_RESULT_BACK or result == System.MSGDIALOG_RESULT_UNKNOWN1) then
    break;
  end

  end
MainMenu()
end

function ModeLauncher()
  while true do
    if statut == "MainMenu" then
      if selecteur == 1 then
      SinglePlayer()
       return false
      end
      
      if selecteur == 2 then
      StayingAlive()
      return false
      end
      
      if selecteur == 3 then
      TwoPlayers()
      return false
      end
      
      if selecteur == 4 then
      Setup()
      return false
      end
      
      if selecteur == 5 then 
      Help()
      return false
      end
      
    end
  end
ClearRam(100)
end

function MainMenu()

Firmware()
DisplayUsername()
local fond = Image.load("IMAGES/MenuPrincipal.png")
selecteur = 1

  while true do

   System.draw()
    screen:clear() -- on actualise l'ecran
    screen:blit(0,0,fond) -- on affiche le menu principal
   System.endDraw()
   
    if display == "6.35" or display == "6.31" or display == "6.20" then
      System.draw()
        ifont:print(450,10, reead)
        --ifont:print(450,20, "" ..display)
      System.endDraw()
    else
      System.draw()
        ifont:print(450,10, "Noname")
        --ifont:print(450,20, "" ..display)
      System.endDraw()
    end

   
 
    if Controls.readPeek():up() then
      System.sleep(200)
      selecteur = selecteur - 1
    end
     
    if Controls.readPeek():down() then
      System.sleep(200)
      selecteur = selecteur + 1
    end
    
    if selecteur > 5 then
    selecteur = 1
    end -- au cas ou sa passe au dessus de 5 ^^"

    if selecteur < 1 then
    selecteur = 5
    end -- ""  ""  ""  ""  ""  ""  ""  ""  "" ""

    if selecteur == 1 then
      System.draw()
      screen:print(43,79,"->",red)
      System.endDraw()
    end -- on affiche le curseur

    if selecteur == 2 then
      System.draw()
      screen:print(43,104,"->",red)
      System.endDraw()
    end -- ""  ""  ""  ""  "" ""
    if selecteur == 3 then
      System.draw()
      screen:print(43,128,"->",red)
      System.endDraw()
    end -- ""  ""  ""  ""  "" ""

    if selecteur == 4 then
      System.draw()
      screen:print(43,153,"->",red)
      System.endDraw()
    end -- ""  ""  ""  ""  "" ""

    if selecteur == 5 then
      System.draw()
      screen:print(43,177,"->",red)
      System.endDraw()
    end -- ""  ""  ""  ""  "" ""


    if Controls.readPeek():cross() then
      if selecteur == 1 or selecteur == 2 or selecteur == 3 or selecteur == 4 or selecteur == 5 then
        statut = "MainMenu"
        ModeLauncher()
        return false
      end
    end

   screen.flip() -- on refresh l'ecran
   screen.waitVblankStart()
  end
ClearRam(100)
end

function LoadDecors()
  if ifBallExist == false then
    if levels <= 51 then
      Level()  
    else 
      MainMenu()
    end
  end
end  

function Win()

  if Controls.readPeek():l() and Controls.readPeek():r() then
    levels = levels + 1
    ifBallExist = false
    LoadDecors()
  end
end

function Move()

  if Controls.readPeek():left() and cochon.x >0 then --Si le cochon ne sort pas du cote gauche de l'ecran alors..
    cochon.x = cochon.x -3 -- On le bouge de 3px vers la gauche (groin groin)
    cochon.img = cochonleft -- On charge le profil gauche de la belle
  end
    
  if Controls.readPeek():right() and cochon.x <440 then
    cochon.x = cochon.x +3
    cochon.img = cochonright
  end
    
  if not Controls.readPeek():left() and not Controls.readPeek():right() then
    cochon.img = cochonfix
  end
    
end

--[[
x : position initiale de la balle en abcisses : entre 0 et 480
y : position initiale de la balle en ordonnees : entre 0 et 272
vx : vitesse et orientation de la balle (X) : vecteur vx + vecteur vy = vitesse + orientation balle
vy : vitesse et orientation de la balle (Y) : vecteur vx + vecteur vy = vitesse + orientation balle
g : gravite : valeur reelle : 2-3
a : frottements de l'air : pourcentage de la vitesse conservee sur 100. Ex : 0.95
t : temps d'attente en millisecondes entre chaque mouvement de balle
obj : image de la balle
]]
--

function Balle()

fond = Image.load("IMAGES/Levels/" .. levels .. ".png")
x = 10
y = 20
vx = 3
vy = 5
g = 1
t = 20
obj = image

  while true do   
   
      wvx = vx
      wvy = vy + g
      wx = x + wvx
      wy = y + wvy
     
   System.draw()
      if wy >= (231-(obj:height()/2)) or wy <= 0 then
        wy = y
       wvy = 0 - (vy+g)
      elseif wx >= (468-(obj:height()/2)) or wx <= 0 then
       wx = x
      wvx = 0 - vx
     end
   
   
      x = wx
      y = wy
      vx = wvx
      vy = wvy
    
   System.endDraw()
    
    System.draw()
    Move()   
    Win()
    screen:blit(0, 0, fond)-- le decor
    screen:blit(0,239, patron)-- le patron
    screen:blit(cochon.x, cochon.y, cochon.img) -- Groin groin
    screen:blit(x,y,obj)
    screen:print(178, 255, "" .. levels .. "", white)
        -----------------------Level--------------------------
    
  if cochon.x == 1 and cochon.y == 187 and cochon.img == cochonleft then --Lorsque le cochon rentre dans le mur vers la gauche
    move_gauche = false -- il rentre dans le mur et ne peux plus aller vers la gauche
  else -- Si tout va bien
    move_gauche = true -- il peut bouger
  end
  if cochon.x == 462 and cochon.y == 187 and cochon.img == cochonright then 
    move_droit = false
  else
    move_droit = true 
  end
  
  ---------------------------------------------------------
  
  ---Pause---
  if Controls.readPeek():start() then
    Pause()  
  end
  -----------
  ---Display Level---
  
  -------------------
  
    System.endDraw()
      System.sleep(t)
      screen.flip()  
    System.draw()
      screen:clear()
    System.endDraw()    
  end
end
--]]
------------------



function Level()
fond = Image.load("IMAGES/Levels/" .. levels .. ".png")
--patron = Image.load("IMAGES/Levels/Patron.png")
  
  
  while true do
  Balle()
  end
end
